package base

import (
	"payme3000/framework/config_center"

	"github.com/zeromicro/go-zero/core/logx"
	"github.com/zeromicro/go-zero/core/service"
)

const (
	AppEnvKey = "app_env"
)

var (
	// DebugMode 属于调试模式的运行环境
	DebugMode = []string{
		service.DevMode,
		service.TestMode,
	}

	ReleaseMode = []string{
		service.PreMode,
		service.ProMode,
	}
)

type (
	// OptionFunc AppConf的可配置的配置项
	OptionFunc func(*AppConf)

	ConfigCenterRestConf struct {
		Host    string `json:"Host"`
		Port    int    `json:"Port"`
		Timeout int64  `json:"Timeout"` // 用默认的就可以, 一般不需要设置
	}

	ConfigCenterRpcServerConf struct {
		ListenOn string `json:"ListenOn"`
		Timeout  int64  `json:"Timeout"` // 用默认的就可以, 一般不需要设置
	}

	ConfigCenterServiceConf struct {
		Log           *logx.LogConf              `json:"log"`
		RestConf      *ConfigCenterRestConf      `json:"rest_conf"`
		RpcServerConf *ConfigCenterRpcServerConf `json:"rpc_server_conf"`
	}

	// AppConf 服务的启动配置, 由Cmd创建并传递到Application
	AppConf struct {
		Name                  string
		RpcKey                string // 服务发现的key
		ImageTag              string // 服务使用的镜像tag
		DbConfPath            string // db.json的文件路径, 配置中心需要依赖该文件
		IsDisableConfigCenter bool   // 是否禁用配置中心, 通常无任何外部资源访问时可以禁用
		IsStopAfterJobDone    bool   // 是否当所有单次Job任务完成后退出程序

		DefaultRequestTimeout int64 // 默认请求超时时间, 适用于http请求和rpc请求, 单位毫秒, 默认6500ms

		ServiceConf             *service.ServiceConf     // go-zero服务的基本配置项
		ConfigCenterServiceConf *ConfigCenterServiceConf // 配置中心的服务配置

		KafkaReactor config_center.IKafkaReactor // 配置中心用到的kafka驱动
		DbReactor    config_center.IDbReactor    // 配置中心用到的db驱动
	}
)

func WithName(name string) OptionFunc {
	return func(c *AppConf) {
		c.Name = name
	}
}

func WithKafkaReactor(kafkaReactor config_center.IKafkaReactor) OptionFunc {
	return func(c *AppConf) {
		c.KafkaReactor = kafkaReactor
	}
}

func WithDbReactor(dbReactor config_center.IDbReactor) OptionFunc {
	return func(c *AppConf) {
		c.DbReactor = dbReactor
	}
}

func WithDisableConfigCenter() OptionFunc {
	return func(c *AppConf) {
		c.IsDisableConfigCenter = true
	}
}

func WithStopAfterJobDone() OptionFunc {
	return func(c *AppConf) {
		c.IsStopAfterJobDone = true
	}
}

func (c *AppConf) IsProdMode() bool {
	return c.ServiceConf.Mode == service.ProMode
}

func (c *AppConf) IsPreMode() bool {
	return c.ServiceConf.Mode == service.PreMode
}

func (c *AppConf) IsTestMode() bool {
	return c.ServiceConf.Mode == service.TestMode
}

func (c *AppConf) IsDevMode() bool {
	return c.ServiceConf.Mode == service.DevMode
}
